package com.woniu.tools;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.woniu.been.entity.CategoryNode;
import com.woniu.been.entity.Courses;

import java.util.*;


public class CourseTreeBuilder  {

        public static class StageNode {
            private String stageName;
            private List<Courses> courses = new ArrayList<>();
            private Double totalPrice = 0.0;

            public StageNode(String stageName) {
                this.stageName = stageName;
            }

            // 添加课程并累加价格
            public void addCourse(Courses course) {
                this.courses.add(course);
                this.totalPrice += course.getPrice();
            }

            // getters
            public String getStageName() { return stageName; }
            public List<Courses> getCourses() { return courses; }
            public Double getTotalPrice() { return totalPrice; }
        }

        /**
         * 构建课程树形结构
         * @param coursesList 原始课程列表
         * @return 树形结构列表
         */
        public static List<CategoryNode> buildCourseTree(List<Courses> coursesList) {
            // 按分类分组
            Map<String, CategoryNode> categoryMap = new HashMap<>();

            for (Courses course : coursesList) {
                // 创建不可变的局部变量副本，以便在lambda中使用
                final String categoryName = course.getCategoryname() != null ?
                        course.getCategoryname() : "未分类";
                final String stageName = course.getName() != null ?
                        course.getName() : "未命名阶段";

                // 获取或创建分类节点
                CategoryNode category = categoryMap.computeIfAbsent(
                        categoryName,
                        name -> new CategoryNode(name)
                );

                // 使用不可变的category引用
                final CategoryNode finalCategory = category;

                // 查找或创建阶段节点
                Optional<StageNode> existingStage = finalCategory.getStages().stream()
                        .filter(s -> stageName.equals(s.getStageName()))
                        .findFirst();

                StageNode stage = existingStage.orElseGet(() -> {
                    StageNode newStage = new StageNode(stageName);
                    finalCategory.addStage(newStage);
                    return newStage;
                });

                // 添加课程到阶段
                stage.addCourse(course);
            }

            return new ArrayList<>(categoryMap.values());
        }

        /**
         * 将树形结构转换为JSON字符串
         */
        public static String toJson(List<CategoryNode> tree) throws JsonProcessingException {
            ObjectMapper mapper = new ObjectMapper();
            return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(tree);
        }

        // 测试示例
//        public static void main(String[] args) throws JsonProcessingException {
//            // 模拟数据（实际使用时从数据库获取）
//            List<Courses> coursesList = new ArrayList<>();
//
//            coursesList.add(new Courses(1, "java语言基础", "单独课程", 2000.0,
//                    null, null, null, null, null, null, null, null, "java第一阶段", "java"));
//
//            coursesList.add(new Courses(2, "java面向对象", "单独课程", 2220.0,
//                    null, null, null, null, null, null, null, null, "java第一阶段", "java"));
//
//            coursesList.add(new Courses(3, "java核心api", "单独课程", 3330.0,
//                    null, null, null, null, null, null, null, null, "java第二阶段", "java"));
//
//            coursesList.add(new Courses(4, "redis", "课程", 2500.0,
//                    null, null, null, null, null, null, null, null, "java第二阶段", "java"));
//
//            // 构建树形结构
//            List<CategoryNode> courseTree = buildCourseTree(coursesList);
//
//            // 输出JSON
//            System.out.println(toJson(courseTree));
//        }
    }